using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;

namespace Game
{
    /**
     * 游戏主应用类 (GameApp)
     * 
     * 功能说明：
     * - 游戏的核心管理类，负责整个游戏的生命周期管理
     * - 使用单例模式，确保全局只有一个实例
     * - 管理游戏状态机，控制游戏流程
     * - 协调各个初始化器，完成游戏启动
     * 
     * 设计模式：
     * - 单例模式 (Singleton Pattern)
     * - 状态模式 (State Pattern)
     * - 策略模式 (Strategy Pattern) - 通过初始化器
     * 
     * 生命周期：
     * 1. Awake: 单例初始化，设置为常驻对象
     * 2. Start: 初始化状态机和游戏系统
     * 3. Update: 更新状态机
     */
    public class GameApp : MonoBehaviour
    {
        /**
         * 游戏状态机
         * 
         * 说明：
         * - 管理游戏的各种状态（Logo、Login、Main、Battle等）
         * - 控制游戏流程的切换
         * - 每帧更新当前状态
         */
        public StateMachine<GameApp> StateMachine { get; private set; }

        /**
         * 单例实例
         * 
         * 说明：
         * - 使用私有静态字段存储唯一实例
         * - 通过公共属性访问，确保全局唯一
         */
        static GameApp _instance;
        
        /**
         * 单例访问器
         * 
         * 功能：
         * - 提供全局访问点
         * - 确保线程安全的单例访问
         */
        public static GameApp Instance
        {
            get
            {
                return _instance;
            }
        }

        /**
         * Unity生命周期：Awake方法
         * 
         * 功能：
         * - 单例模式的初始化
         * - 设置对象为常驻对象，不被场景切换销毁
         * - 防止重复创建实例
         */
        public void Awake()
        {
            Debug.Log("GameApp Awake - 游戏主应用初始化开始");

            if (_instance == null)
            {
                // 设置单例实例
                _instance = this;

                // 设置为常驻对象，在场景切换时不被销毁
                DontDestroyOnLoad(gameObject);
                
                Debug.Log("GameApp: 单例初始化成功，设置为常驻对象");
            }
            else
            {
                // 检测到重复实例，打印错误信息
                Debug.LogError("GameApp: 单例重复创建错误 - 已存在GameApp实例");
            }
        }

        /**
         * 初始化游戏系统
         * 
         * 功能：
         * - 获取所有GameInitializer组件
         * - 按优先级排序初始化器
         * - 依次执行初始化操作
         * 
         * 设计说明：
         * - 使用组件模式，支持多个初始化器
         * - 通过优先级控制初始化顺序
         * - 便于扩展和维护
         */
        private void Initialize()
        {
            Debug.Log("GameApp: 开始初始化游戏系统");

            // 获取所有GameInitializer组件
            GameInitializer[] initializers = GetComponents<GameInitializer>();

            // 根据优先级排序（因为添加组件的时候调用顺序不一定好控制）
            Array.Sort(initializers, (a, b) => a.Priority.CompareTo(b.Priority));
            
            // 依次执行初始化
            foreach (var initializer in initializers)
            {
                Debug.Log($"GameApp: 执行初始化器 - {initializer.GetType().Name}");
                initializer.Initialize(this);
            }

            Debug.Log("GameApp: 游戏系统初始化完成");
        }

        /**
         * Unity生命周期：Start方法
         * 
         * 功能：
         * - 初始化状态机
         * - 执行游戏系统初始化
         * - 启动游戏主流程
         */
        void Start()
        {
            Debug.Log("GameApp Start - 游戏主应用启动");

            // 初始化状态机，传入自身作为持有者
            StateMachine = new StateMachine<GameApp>(this);
            Debug.Log("GameApp: 状态机初始化完成");

            // 初始化游戏系统
            // 获取初始化组件，执行初始化操作
            GameInitializer gameInitializer = GetComponent<GameInitializer>();
            if (gameInitializer != null)
            {
                Debug.Log("GameApp: 开始执行游戏初始化");
                gameInitializer.Initialize(this);
            }
            else
            {
                // 不能为空，打印错误日志
                Debug.LogError("GameApp: 错误 - 没有找到GameInitializer组件，游戏无法正常启动");
            }
        }

        /**
         * Unity生命周期：Update方法
         * 
         * 功能：
         * - 每帧更新状态机
         * - 确保当前状态得到及时更新
         * - 处理状态切换和状态逻辑
         */
        void Update()
        {
            // 更新状态机，处理当前状态的逻辑
            StateMachine.Update();
        }
    }
}